#!/bin/bash

# OpenWhisk 集群部署脚本
# 功能：
# 1. 标记核心节点和多个 Invoker 节点
# 2. 部署 MongoDB 和 Redis 相关资源

set -euo pipefail  # 严格错误处理

# 如果openwhisk的命名空间已经存在，则提示已创建继续执行，否则创建命名空间
NAMESPACE="openwhisk"
if kubectl get namespace "$NAMESPACE" &> /dev/null; then
    echo "命名空间 '$NAMESPACE' 已存在，继续执行..."
else
    echo "创建命名空间 '$NAMESPACE'..."
    kubectl create namespace "$NAMESPACE" || {
        echo "错误: 无法创建命名空间 '$NAMESPACE'"
        exit 1
    }
fi
    

# 默认配置
DEFAULT_CORE_NODE="openwhisk-master"
DEFAULT_INVOKER_NODES=("openwhisk-worker1" "openwhisk-worker2")

# 解析命令行参数
usage() {
    echo "使用方法: $0 [-c CORE_NODE] [-i INVOKER_NODES...]"
    echo "示例: $0 -c my-core-node -i invoker1 invoker2 invoker3"
    exit 1
}

# 参数解析
while getopts ":c:i:" opt; do
    case $opt in
        c) CORE_NODE="$OPTARG" ;;
        i) 
            INVOKER_NODES=()
            shift $((OPTIND-1))
            while [[ $# -gt 0 && ! "$1" =~ ^- ]]; do
                INVOKER_NODES+=("$1")
                shift
            done
            OPTIND=1
            ;;
        \?) usage ;;
    esac
done

# 设置默认值（如果没有通过参数指定）
CORE_NODE="${CORE_NODE:-$DEFAULT_CORE_NODE}"
INVOKER_NODES=("${INVOKER_NODES[@]:-${DEFAULT_INVOKER_NODES[@]}}")

# 获取脚本所在目录
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
DEPLOY_DIR="$SCRIPT_DIR/openwhisk-kube-deploy"

# 检查目录是否存在
if [ ! -d "$DEPLOY_DIR" ]; then
    echo "错误: openwhisk-kube-deploy 目录不存在"
    exit 1
fi

echo "=== OpenWhisk 集群部署开始 ==="
echo "配置:"
echo " - 核心节点: $CORE_NODE (标签: openwhisk-role=core)"
echo " - Invoker 节点: ${INVOKER_NODES[*]} (标签: openwhisk-role=invoker)"

# 1. 标记节点
echo "标记节点..."
kubectl label nodes "$CORE_NODE" openwhisk-role=core --overwrite

for node in "${INVOKER_NODES[@]}"; do
    kubectl label nodes "$node" openwhisk-role=invoker --overwrite || {
        echo "警告: 无法标记节点 $node"
    }
done

# 2. 部署基础服务
echo "部署 MongoDB 和 Redis..."
DEPLOY_FILES=(
    "components.yaml"
    "mongo-nodeport-service.yaml"
    "mongo.yaml"
    "pod-metrics-reader-binding.yaml"
    "pod-metrics-reader-role.yaml"
    "redis-nodeport-service.yaml"
    "redis.yaml"
)

cd "$DEPLOY_DIR" || exit 1

for file in "${DEPLOY_FILES[@]}"; do
    if [ -f "$file" ]; then
        echo "正在部署 $file..."
        kubectl apply -f "$file"
    else
        echo "警告: 文件 $file 不存在，跳过"
    fi
done

echo "=== 部署完成 ==="
echo "已执行操作:"
echo "1. 标记节点:"
echo "   - 核心: $CORE_NODE"
echo "   - Invokers: ${INVOKER_NODES[*]}"
echo "2. 已部署以下资源:"
printf "   - %s\n" "${DEPLOY_FILES[@]}"